"""
使用方法
open()方法参数,第一个为路径,第二个为模式(读,写,追加等),第三个参数,为可选的encoding=文件编码(需要注意的是,该文件编码不写的情况下是默认跟随系统的)
例外,第二个参数不写默认为读模式
# 结果会返回一个文件对象
"""
import json


# 文件的只读操作
def openRead():
    with open("文件读操作例子.txt", "r", encoding="utf-8") as f:
        # 该方法会一次性读取文件的全部内容,如果在原有基础上在此调用该方法
        # #则会读取到空的字符串,说明文件里已经读取完成了
        # 该方法会读取文件里的所有内容并返回字符串
        # 如在此基础上继续读取会读取到空的字符串
        # 如果文件很大的情况下,最好不要使用read方法直接全部读取出来,因为这样会非常占用内存
        # 或者在read(字节长度)里填写长度.第一次会读取指定字节的文件内容,下一次调用对应的同样参数的字节长度就会在原有基础上继续读取指定字节长度的文件内
        content = f.read()
        # 该方法每次调用会读取一行,下次调用会读取下一行,下下次会调用下下一行,以此类推,直到读取不到内容返回空字符串
        # f.readline()
        # 该方法会一次读取文件每一行内容,并以列表形式返回,列表里的每一个元素,对应文件里的每一行内容
        # f.readlines()

        # 一般情况下如果用完需要关闭文件流,释放资源
        # 这种需要手动关闭
        # 如果使用 with open() as 对象名:这种就不需要手动关闭,执行完该缩进的代码会自动关闭文件流
        f.close()


# 文件只写操作
def openWrite():
    # 很多跟文件读操作,一样
    # 有2点跟读文件不一样的,是,当文件不存在时读取会抛出异常,而写操作时,如果文件不存在,则会自动创建对应文件并写入文件内容
    # 在不是读的模式下进行读会抛出异常
    # 第一个路径,第二个,文件的模式,写入的模式为w
    # 需要注意的是,如果用w模式写入文件操作,会将文件里的原有的内容覆盖(可以理解为清空了文件里的内容,并把内容写入进去)
    # 这里使用with方式,用完会自动关闭文件流
    with open("写文件操作例子.txt", "w", encoding="utf-8") as f:
        f.write("我是写入内容")
        # 说明,如果文件该文件流还没关闭的情况下,继续执行write方法会追加对应的字符串且不会换行,除非内容里有换行符
        f.write("我是在此写入的内容")


# 文件的追加内容操作-输入写的一种类型
def openAppend():
    # 同理很多地方跟文件读写一样,该追加模式跟文件写操作几乎一样,就是创建该文件对象执行操作,不会覆盖原有的内容,反而会在原有的内容上进行追加内容

    with open("追加文件操作例子.txt", "a", encoding="utf-8") as f:
        f.write("我是第一个追加内容")
        f.write("我是第二个追加内容")


# 文件读写操作,,可以同时支持文件读取和写入 r+模式
def openReadWrite():
    # 打开文件之后如果文件不存在调用读和写会抛出异常!
    # 并且写入内容时会以追加形式添加内容
    with open("deno.txt", "r+", encoding="utf-8") as f:
        # 文件读操作
        # 一次性读取文件里全部内容
        print(f.read())
        # 文件写操作

        f.write("我是写入的内容")
        print(f.read())


def readFileLine():
    """逐行读取"""
    with open("deno.txt", encoding="utf-8") as file:
        for line in file:
            print(line)
        file.close()


def writeObjFIle():
    with open("写入一个对象.txt", "w+", encoding="utf-8") as f:
        f.write(json.dumps({"name": "小明", "age": 15}))
        f.close()


def readObjFile():
    """读取对象"""
    f = open("写入一个对象.txt", "r+", encoding="utf-8")
    print(json.load(f))


if __name__ == '__main__':
    readObjFile()
